package com.motu.monstercity.server.gate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class RobotManager {

    public static final Logger logger = LoggerFactory.getLogger("RobotManager");
    public static int testNum = 0;

    /**
     * 批量创建机器人
     */
//    public static void batchCreateRobot(){
//        ServerInfo serverInfo = ServerManager.getDefaultServer();
//        for (int i = 0; i < ServerParam.ROBOT_CREATE_USER_NUM; i++) {
//            createRobot(serverInfo).onComplete(createUserRes->{
//                if (createUserRes.succeeded()) {
//                    long userId = createUserRes.result();
////                    logger.info("create robot success userid = " + userId);
//                    sendInitRobotRequest(userId);
//                } else {
//                    logger.error("create user error !!!");
//                }
//            });
//        }
//    }
//
//    /**
//     * 压力测试CMD_GAME_SYSTEM_INIT协议
//     */
//    public static void testSystemInit(){
//        if (ServerParam.ROBOT_TEST_INTERVAL_TIME > 0){
//            testNum = 0;
//            MainVerticle.instance.vertxInstance.setPeriodic(ServerParam.ROBOT_TEST_INTERVAL_TIME, handler -> {
//                testNum++;
//                testSystemInitLogic(testNum);
//                logger.info("testSystemInitLogic num:{}", testNum);
//                if (testNum >= ServerParam.ROBOT_TEST_INTERVAL_NUM){
//                    MainVerticle.instance.vertxInstance.cancelTimer(handler);
//                }
//            });
//        } else{
//            testSystemInitLogic(0);
//        }
//    }
//
//    public static void testSystemInitLogic(int index){
//        long ROBOT_TEST_START_ID = ServerParam.ROBOT_TEST_START_ID == 0 ? ServerParam.TABLE_INIT_ID : ServerParam.ROBOT_TEST_START_ID;
//        ROBOT_TEST_START_ID += (MainVerticle.gateNumber - 1) * ServerParam.ROBOT_TEST_REQUEST_NUM;
//        if (index > 0 && ServerParam.ROBOT_TEST_GATE_NUM > 0){
//            ROBOT_TEST_START_ID += (index - 1) * ServerParam.ROBOT_TEST_GATE_NUM * ServerParam.ROBOT_TEST_REQUEST_NUM;
//        }
//        for (int i = 0; i < ServerParam.ROBOT_TEST_REQUEST_NUM; i++) {
//            long userId = ROBOT_TEST_START_ID + i;
//            sendSystemInitRequest(userId);
//        }
//    }
//
//    /**
//     * 通过网关服发送给游戏服预热
//     */
//    public static void prepareGame(){
//        for (int i = 0; i < ServerParam.ROBOT_TEST_REQUEST_NUM; i++) {
//            sendInitRobotRequest(0);
//        }
//    }
//
//    /**
//     * 创建机器人
//     */
//    private static Future<Long> createRobot(ServerInfo serverInfo) {
//        Promise<Long> promise = Promise.promise();
//        incrTableId("user_info").setHandler(getUserIdRes -> {
//            if (getUserIdRes.succeeded()) {
//                long userId = getUserIdRes.result();
//                int serverId = serverInfo != null ? serverInfo.getServerId() : 1002;
//                int platform = 1;
//                int language = 1;
//                String roleName = String.valueOf(userId);
//                String sqlInsert = "INSERT INTO user_info(id,server_id,user_name,icon,gender,location) VALUES(?,?,?,?,?,?);";
//                JsonArray paramsInsert = new JsonArray();
//                paramsInsert.add(userId);
//                paramsInsert.add(serverId);
//                paramsInsert.add(roleName);
//                paramsInsert.add(0);
//                paramsInsert.add(0);
//                paramsInsert.add(0);
//                MysqlTool.updateToDb(MainVerticle.instance.jdbcClientGame, sqlInsert, paramsInsert, resInsert -> {
//                    if (resInsert.succeeded()) {
//                        long uid = userId;
//                        String sqlInsert2 = "insert into user_ext_info(id,server_id,platform,register_time,language) "
//                                + "values(?,?,?,?,?);";
//                        JsonArray paramsInsert2 = new JsonArray();
//                        paramsInsert2.add(uid);
//                        paramsInsert2.add(serverId);
//                        paramsInsert2.add(platform);
//                        paramsInsert2.add(TimeUtils.getCurTime());
//                        paramsInsert2.add(language);
//                        MysqlTool.updateToDb(MainVerticle.instance.jdbcClientGame, sqlInsert2, paramsInsert2, resInsert2 -> {
//                            if (resInsert2.succeeded()) {
//                                // 把userinfo和userextinfo添加到redis中
//                                String strUserinfoKey = RedisKey.getUserInfoKey(uid);
//                                JsonObject objUserinfo = new JsonObject();
//                                objUserinfo.put("id", uid);
//                                objUserinfo.put("serverId", serverId);
//                                objUserinfo.put("userName", roleName);
//                                RedisTools.setHashJsonObject(MainVerticle.instance.redisClient, strUserinfoKey, objUserinfo, h -> {
//                                    if (h.succeeded()) {
//                                        // 标记数据已经初始化
//                                        RedisTools.set(MainVerticle.instance.redisClient, getEntityInitKey(strUserinfoKey), "1");
//                                        String strUserextinfoKey = RedisKey.getUserExtInfoKey(uid);
//                                        JsonObject objUserextinfo = new JsonObject();
//                                        objUserextinfo.put("id", uid);
//                                        objUserextinfo.put("serverId", serverId);
//                                        objUserextinfo.put("platform", platform);
//                                        objUserextinfo.put("registerTime", TimeUtils.getCurTime());
//                                        objUserextinfo.put("language", language);
//                                        RedisTools.setHashJsonObject(MainVerticle.instance.redisClient, strUserextinfoKey, objUserextinfo, h1 -> {
//                                            if (h1.succeeded()) {
//                                                // 标记数据已经初始化
//                                                RedisTools.set(MainVerticle.instance.redisClient, getEntityInitKey(strUserextinfoKey), "1");
//                                                promise.complete(userId);
//                                            } else {
//                                                promise.fail(h1.cause());
//                                            }
//                                        });
//                                    } else {
//                                        promise.fail(h.cause());
//                                    }
//                                });
//                            } else {
//                                promise.fail(resInsert2.cause());
//                            }
//                        });
//                    } else {
//                        promise.fail(resInsert.cause());
//                    }
//                });
//            } else {
//                promise.fail(getUserIdRes.cause());
//            }
//        });
//        return promise.future();
//    }
//
//    /**
//     * 获取自增ID
//     */
//    private static Future<Long> incrTableId(String key) {
//        Promise<Long> promise = Promise.promise();
//        if (MainVerticle.instance.redisClient == null) {
//            logger.error("####### redisClient == null");
//        }
//        long initId = ServerParam.TABLE_INIT_ID;
//        RedisTools.hsetnx(MainVerticle.instance.redisClient, RedisTools.getTableidKey(), key, String.valueOf(initId), h -> {
//            if (h.succeeded()) {
//                if (h.result()) {
//                    logger.info("### table = " + key + " init id = " + initId);
//                    promise.complete(initId);
//                } else {
//                    RedisTools.incrTableId(MainVerticle.instance.redisClient, key, h2 -> {
//                        if (h2.succeeded()) {
//                            promise.complete(h2.result());
//                        } else {
//                            promise.fail(h2.cause());
//                        }
//                    });
//                }
//            } else {
//                promise.fail(h.cause());
//            }
//        });
//        return promise.future();
//    }
//
//    public static String getEntityInitKey(String entityKey) {
//        return "entity.init." + entityKey;
//    }
//
//
//    /***
//     * 发送初始化机器人数据协议
//     */
//    public static void sendInitRobotRequest(long userId) {
//        try {
//            int cmdCode = 79981;
//            String cmdName = "CMD_GAME_SYSTEM_TEST_INIT_ROBOT";
//            int language = 1;
//            String ebName = Constant.getEventBusName(MainVerticle.getLocalName(), Constant.EVENT_BUS_GAME_LOGIC);
//            JsonObject params = new JsonObject();
//            Builder builder = ProtobufManager.getRequestBuild(cmdName);
//            if (builder == null) {
//                logger.error("调试命令没有配置");
//                return;
//            }
//            JsonFormat.merge(params.toString(), builder);
//            byte[] pbdata = builder.build().toByteArray();
//
//            if (RobotManager.isMessageQueueWay()) {
//                // 所有用户的协议放入队列按线程执行
//                SocketManager.addMessageQueue(userId, new MessageInfo(MainVerticle.instance.vertxInstance, userId, cmdCode, pbdata, 1, 0, null));
//            } else{
//                RobotManager.requestToGame(MainVerticle.instance.vertxInstance, userId, ebName, cmdCode, cmdName, pbdata, language, true);
//            }
//        } catch (Exception e) {
//            logger.error(Tool.getException(e));
//        }
//    }
//
//    /***
//     * 发送初始化进入游戏协议
//     */
//    public static void sendSystemInitRequest(long userId) {
//        try {
//            int cmdCode = 79900;
//            String cmdName = "CMD_GAME_SYSTEM_INIT";
//            int language = 1;
//            String ebName = Constant.getEventBusName(MainVerticle.getLocalName(), Constant.EVENT_BUS_GAME_LOGIC);
//            JsonObject params = new JsonObject();
//            Builder builder = ProtobufManager.getRequestBuild(cmdName);
//            if (builder == null) {
//                logger.error("调试命令没有配置");
//                return;
//            }
//            JsonFormat.merge(params.toString(), builder);
//            byte[] pbdata = builder.build().toByteArray();
//
//            if (RobotManager.isMessageQueueWay()) {
//                // 所有用户的协议放入队列按线程执行
//                SocketManager.addMessageQueue(userId, new MessageInfo(MainVerticle.instance.vertxInstance, userId, cmdCode, pbdata, 1, 0, null));
//            } else{
//                RobotManager.requestToGame(MainVerticle.instance.vertxInstance, userId, ebName, cmdCode, cmdName, pbdata, language, true);
//            }
//        } catch (Exception e) {
//            logger.error(Tool.getException(e));
//        }
//    }
//
//    /**
//     * 协议转发到游戏服处理
//     */
//    public static void requestToGame(Vertx vertx, long userId, String ebName, int cmdCode, String cmdName, byte[] pbdata, int language, boolean clientRequest) {
//        EventBus eventBus = vertx.eventBus();
//        JsonObject obj = new JsonObject().put("lan", language).put("uid", userId).put("code", cmdCode).put("data", pbdata).put("messageId", 0);
//
////		logger.info("userid = " + userId + " send cmd = " + cmdName);
//        eventBus.request(ebName, obj, ar -> {
//            if (ar.succeeded()) {
//                JsonObject recData = (JsonObject) ar.result().body();
//                if (recData != null && recData.containsKey("code")) {
//                    int resCode = recData.getInteger("code");
//                    byte[] resData = recData.getBinary("data");
////                    try {
////                        if (resCode == EnumCmdID.CMD_GAME_SYSTEM_LOGIC_ERROR_VALUE) {
////                            Builder res_build = ProtobufManager.getResponseBuild("CMD_GAME_SYSTEM_LOGIC_ERROR");
////                            res_build.mergeFrom(resData);
////                            String responseJson = JsonFormat.printToString(res_build.build());
//////                            logger.info("userid = " + userId + " run cmd = " + cmdName + " success errcode = " + responseJson);
////                        } else {
////                            Builder res_build = ProtobufManager.getResponseBuild(cmdName);
////                            res_build.mergeFrom(resData);
////                            String responseJson = JsonFormat.printToString(res_build.build());
//////                            logger.info("userid = " + userId + " run cmd = " + cmdName + " success!!!");
////                        }
////                    } catch (Exception e) {
////                        logger.error("userid = " + userId + " run cmd = " + cmdName + " error!!!");
////                        logger.error(Tool.getException(e));
////                    }
//                }
//            } else {
//                logger.error("userid = " + userId + " run cmd = " + cmdName + " error!!!");
//                logger.error("eventBus.send failed:" + ar.cause().getMessage());
//            }
//        });
//    }
//
//    /**
//     * 是否是消息队列执行方式
//     */
//    public static boolean isMessageQueueWay(){
//        return ServerParam.ROBOT_TEST_WAY == 1;
//    }

}
